/*
 * Copyright (c) 2023 fred
 * Licensed under the Apache License,Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 */
import { Node } from '../nodes/Node';
import { FilterResult } from './FilterResult';

export interface NodeFilter {

  /**
   * Callback for when a node is first visited.
   * @param node the node being visited.
   * @param depth the depth of the node, relative to the root node. E.g., the root node has depth 0, and a child node of that will have depth 1.
   * @return Filter decision
   */
  head(node:Node, depth:number) :FilterResult

  /**
   * Callback for when a node is last visited, after all of its descendants have been visited.
   * <p>This method has a default implementation to return {@link FilterResult#CONTINUE}.</p>
   * @param node the node being visited.
   * @param depth the depth of the node, relative to the root node. E.g., the root node has depth 0, and a child node of that will have depth 1.
   * @return Filter decision
   * 默认返回 FilterResult.CONTINUE
   */
   tail(node:Node, depth:number):FilterResult
}

